package cn.itsource.basic.service.impl;

import cn.itsource.basic.constant.UserConstants;
import cn.itsource.basic.exception.BusinessException;
import cn.itsource.basic.service.IVerifyCodeService;
import cn.itsource.basic.util.StrUtils;
import cn.itsource.user.domain.User;
import cn.itsource.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Autowired
    private UserMapper userMapper;


    @Override
    public void smsCode(Map<String,String> params) {
        String phone = params.get("phone");
        String type = params.get("type");//业务类型
        //1.校验
        //1.1 手机号空校验
        if(!StringUtils.hasLength(phone)){
            throw new BusinessException("请输入手机号！");
        }
        if("register".equals(type)){
            //1.2 手机号是否被注册==？？？？
            User user = userMapper.loadByPhone(phone);
            if (user != null) {
                throw new BusinessException("请勿重复注册！");
            }
            String businessKey = UserConstants.USER_REGISTER_CODE_PREFIX + phone;
            sendSmsCode(businessKey);
        }else if("binder".equals(type)){
            String businessKey = UserConstants.BINDER_CODE_PREFIX + phone;
            sendSmsCode(businessKey);
        }
    }

    public void sendSmsCode(String businessKey){
        //2.判断验证码是否存在  （从redis中拿 key：  业务code:phone）
        Object codeObj = redisTemplate.opsForValue().get(businessKey);
        String code = null;
        //2.1 如果存在
        if(codeObj != null){
            String codeStr  = (String) codeObj;// code:time
            Long time = Long.valueOf(codeStr.split(":")[1]);//发送验证码的时间戳
            Long interval = System.currentTimeMillis()-time;
            //2.1.1 判断是否过了重发时间（value：  VerifyCode:time）
            //2.1.1.1 如果没过  直接抛业务异常：请勿重复发送验证码
            if(interval <= 1*60*1000){//还没有过重发时间
                throw new BusinessException("请勿重复发送验证码！！");
            }
            //2.1.1.2 如果过了重发时间（还未过有效期）   使用原来还没有过期的验证码 （放到下面去刷新）
            code = codeStr.split(":")[0];
        }else{
            //2.2 不存在
            //2.2.1 生成新的验证码
            code = StrUtils.getComplexRandomString(4);
        }
        //3.存储redis，并设置过期时间
        redisTemplate.opsForValue().set(
                businessKey,
                code+":"+System.currentTimeMillis(),
                3,
                TimeUnit.MINUTES);
        //4.调用短信接口，发送验证码
        /*SmsUtils.send(phone, "您的验证码是："+code+";请在三分钟内使用！");*/
        System.out.println("您的验证码是："+code+";请在三分钟内使用！");
    }
}
